home *** CD-ROM | disk | FTP | other *** search
/ The Original Shareware 1.1 / The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso / 6 / cmerge.zip / SIEVE.ASL < prev    next >
Text File  |  1987-06-08  |  3KB  |  189 lines

  1.     .186
  2.     name    sieve
  3. _text    segment    byte public 'code'
  4. dgroup    group    _data,_bss
  5.     assume    cs:_text,ds:dgroup,ss:dgroup
  6. _text    ends
  7. _data    segment word public 'data'
  8. _d@    label    byte
  9. _data    ends
  10. _bss    segment word public 'bss'
  11. _b@    label    byte
  12. _bss    ends
  13. _data    segment word public 'data'
  14.     public    _flags
  15. _flags    label    byte
  16.     db    0
  17.     db    8190 dup (?)
  18. _data    ends
  19. _text    segment    byte public 'code'
  20. ;|*** 
  21. ;|*** /*    Eratosthenes Sieve Prime Number Program in C, Byte January 1983.
  22. ;|***  *    The code has been corrected to produce primes correctly.
  23. ;|*** */
  24. ;|*** #include <stdio.h>
  25. ;|*** 
  26. ;|*** #define TRUE    1
  27. ;|*** #define FALSE    0
  28. ;|*** #define NITER    150
  29. ;|*** #define SIZE    8190
  30. ;|*** 
  31. ;|*** char flags[SIZE+1]={0};
  32. ;|*** 
  33. ;|*** 
  34. ;|*** main ()
  35. ;|***     {
  36. ; Line 16
  37. _main    proc    near
  38.     push    si
  39.     push    di
  40.     enter    4,0
  41. ;|***     register int i,k;
  42. ; Line 17
  43. ;|***     int iter, count;
  44. ; Line 18
  45. ;|*** 
  46. ; Line 19
  47. ;|***     printf ("%d iterations: ", NITER);
  48. ; Line 20
  49.     db    104    ; push immediate
  50.     dw    150
  51.     mov    ax,offset _s@
  52.     push    ax
  53.     call    near ptr _printf
  54.     add    sp,4
  55. ;|*** 
  56. ; Line 21
  57. ;|***     for( iter = 1; iter <= NITER; iter++ )     /* Do sieve 150 times */
  58. ; Line 22
  59.     mov    word ptr [bp-4],1
  60.     jmp    short @5
  61. @4:
  62. ;|***         {
  63. ; Line 23
  64. ;|***         count = 0;
  65. ; Line 24
  66.     mov    word ptr [bp-2],0
  67. ;|***         for( i = 0; i <= SIZE; i++)      /* set all flags true */
  68. ; Line 25
  69.     xor    si,si
  70.     jmp    short @9
  71. @8:
  72. ;|***             flags[i] = TRUE;
  73. ; Line 26
  74.     mov    byte ptr dgroup:_flags[si],1
  75.     inc    si
  76. @9:
  77.     cmp    si,8190
  78.     jle    @8
  79. ;|*** 
  80. ; Line 27
  81. ;|***         for( i = 2; i <= SIZE; i++ )
  82. ; Line 28
  83.     mov    si,2
  84.     jmp    short @13
  85. @12:
  86. ;|***             {
  87. ; Line 29
  88. ;|***             if ( flags[i] )          /* found a prime */
  89. ; Line 30
  90.     cmp    byte ptr dgroup:_flags[si],0
  91.     je    @11
  92. ;|***                 {
  93. ; Line 31
  94. ;|***                 for ( k = i + i; k <= SIZE; k += i )
  95. ; Line 32
  96.     mov    di,si
  97.     add    di,si
  98.     jmp    short @18
  99. @17:
  100. ;|***                     flags[k] = FALSE;    /* Cancel its multiples */
  101. ; Line 33
  102.     mov    byte ptr dgroup:_flags[di],0
  103.     add    di,si
  104. @18:
  105.     cmp    di,8190
  106.     jle    @17
  107. ;|***                 count++;
  108. ; Line 34
  109.     inc    word ptr [bp-2]
  110. ;|***                 }
  111. ; Line 35
  112. ;|***             }
  113. ; Line 36
  114. @11:
  115.     inc    si
  116. @13:
  117.     cmp    si,8190
  118.     jle    @12
  119. ;|***         }
  120. ; Line 37
  121.     inc    word ptr [bp-4]
  122. @5:
  123.     cmp    word ptr [bp-4],150
  124.     jle    @4
  125. ;|*** 
  126. ; Line 38
  127. ;|***     printf ("%d primes\n", count);
  128. ; Line 39
  129.     push    word ptr [bp-2]
  130.     mov    ax,offset _s@+16
  131.     push    ax
  132.     call    near ptr _printf
  133.     add    sp,4
  134. ;|*** 
  135. ; Line 40
  136. ;|***     exit(0);
  137. ; Line 41
  138.     db    106    ; push immediate
  139.     db    0
  140.     call    near ptr _exit
  141.     inc    sp
  142.     inc    sp
  143. ;|*** 
  144. ; Line 42
  145. ;|***     }
  146. ; Line 43
  147.     leave    
  148.     pop    di
  149.     pop    si
  150.     ret    
  151. _main    endp
  152. _text    ends
  153. _data    segment word public 'data'
  154. _s@    label    byte
  155.     db    37
  156.     db    100
  157.     db    32
  158.     db    105
  159.     db    116
  160.     db    101
  161.     db    114
  162.     db    97
  163.     db    116
  164.     db    105
  165.     db    111
  166.     db    110
  167.     db    115
  168.     db    58
  169.     db    32
  170.     db    0
  171.     db    37
  172.     db    100
  173.     db    32
  174.     db    112
  175.     db    114
  176.     db    105
  177.     db    109
  178.     db    101
  179.     db    115
  180.     db    10
  181.     db    0
  182. _data    ends
  183. _text    segment    byte public 'code'
  184.     extrn    _exit:near
  185.     extrn    _printf:near
  186.     public    _main
  187. _text    ends
  188.     end
  189.